package com.cs.framework.jdbc.hibernate3.dao;

import java.io.Serializable;
import java.sql.SQLException;
import java.util.List;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.support.HibernateDaoSupport;

import com.cs.framework.common.util.CommonUtils;

/**
 * Hibernate数据访问类
 * 
 * @author hedongzhou
 * 
 */
public class HibernateDaoImpl extends HibernateDaoSupport implements HibernateDao {

	/**
	 * 根据主键ID查找实体
	 * 
	 * @param <T>
	 * @param type
	 *            实体class
	 * @param id
	 *            主键ID
	 * @return
	 */
	public <T> T getById(Class<T> type, Serializable id) {
		return type.cast(getHibernateTemplate().get(type, id));
	}

	/**
	 * 保存实体
	 * 
	 * @param <T>
	 * @param entity
	 * @return
	 */
	public <T> T save(T entity) {
		return save(entity, true);
	}

	/**
	 * 保存实体
	 * 
	 * @param <T>
	 * @param entity
	 * @param notNullCheck
	 *            是否需要做非空校验
	 * @return
	 */
	public <T> T save(T entity, boolean notNullCheck) {
		if (notNullCheck) {
			CommonUtils.checkNotNull(entity);
		}

		getHibernateTemplate().save(entity);
		getHibernateTemplate().flush();
		return entity;
	}

	/**
	 * 更新实体
	 * 
	 * @param <T>
	 * @param entity
	 * @return
	 */
	public <T> T update(T entity) {
		return update(entity, true);
	}

	/**
	 * 更新实体
	 * 
	 * @param <T>
	 * @param entity
	 * @param notNullCheck
	 *            是否需要做非空校验
	 * @return
	 */
	public <T> T update(T entity, boolean notNullCheck) {
		if (notNullCheck) {
			CommonUtils.checkNotNull(entity);
		}

		getHibernateTemplate().update(entity);
		getHibernateTemplate().flush();
		return entity;
	}

	/**
	 * 执行更新SQL
	 * 
	 * @param sql
	 *            update语句
	 * @param params
	 *            参数
	 * @return 成功条数
	 */
	public int update(String sql, List<Object> params) {
		final String tempSql = sql;
		final List<Object> tempParams = params;
		return getHibernateTemplate().execute(new HibernateCallback<Integer>() {
			public Integer doInHibernate(Session session) throws HibernateException, SQLException {
				Query query = session.createSQLQuery(tempSql);

				for (int i = 0; i < tempParams.size(); i++) {
					query.setParameter(i, tempParams.get(i));
				}

				return query.executeUpdate();
			}
		});
	}

}
